﻿#define _CRT_SECURE_NO_WARNINGS 1

//C++兼容C语言绝大多数语法

//C语言版的hello worle
//#include<stdio.h>
//int main()
//{
//	printf("hello world\n");
//	return 0;
//}

//C++版的hello world
//#include<iostream>
//using namespace std;
//int main()
//{
//	cout << "hello world\n" << endl;
//	return 0;
//}

//#include<stdio.h>
//#include<stdlib.h>
//int rand = 10;
//int main()
//{
//  编译报错：error C2365: “rand”: 重定义；以前的定义是“函数” 
//	printf("%d\n", rand);
//	return 0;
//}

//#include<stdio.h>
//#include<stdlib.h>
////int rand = 10;
//namespace wj
//{
//	// 命名空间中可以定义变量/函数/类型
//	int rand = 10;
//
//	int Add(int left, int right)
//	{
//		return left + right;
//	}
//
//	struct Node
//	{
//		struct Node* next;
//		int val;
//	};
//}
//int main()
//{
//	// 这⾥默认是访问的是全局的rand函数指针
//	printf("%p\n", rand);
//
//	// 这⾥指定wj命名空间中的rand
//	printf("%d\n", wj::rand);
//
//	return 0;
//}

//#include<stdio.h>
//namespace w
//{
//	//命名空间可以嵌套
//	namespace wj
//	{
//		int rand = 1;
//		
//		int Add(int left, int right)
//		{
//			return left + right;
//		}
//	}
//
//	namespace wzl
//	{
//		int rand = 2;
//		
//		int Add(int left, int right)
//		{
//			return left + right;
//		}
//	}
//}
//int main()
//{
//	printf("wj:%d\n", w::wj::rand);
//	printf("wzl:%d\n", w::wzl::rand);
//
//	printf("wj->Add(6,6):%d\n", w::wj::Add(6, 6));
//	printf("wzl->Add(8,8):%d\n", w::wzl::Add(8, 8));
//	return 0;
//}

//#include<stdio.h>
//#include"Sub.h"
//namespace wj
//{
//	int Add(int left, int right)
//	{
//		return left + right;
//	}
//}
//int main()
//{
//	//多⽂件中可以定义同名namespace，他们会默认合并到⼀起，就像同⼀个namespace⼀样
//	printf("Add(6,8):%d\n", wj::Add(6, 8));
//	printf("Sub(8,6):%d\n", wj::Sub(8, 6));
//	return 0;
//}

//#include<stdio.h>
//namespace wj
//{
//	int a = 1;
//	int b = 2;
//}
//
//int main()
//{
//	// 编译报错：error C2065: “a”: 未声明的标识符
//	//printf("%d\n", a);
//	
//	// 指定命名空间访问
//	//printf("%d\n", wj::a);
//	//printf("%d\n", wj::b);
//
//
//
//	return 0;
//}

// using将命名空间中某个成员展开
//using wj::b;
//int main()
//{
//	printf("%d\n", wj::a);
//	printf("%d\n", b);
//	return 0;
//}

// 展开命名空间中全部成员
//using namespace wj;
//int main()
//{
//	printf("%d\n", a);
//	printf("%d\n", b);
//	return 0;
//}

//#include<iostream>
//using namespace std;
//int main()
//{
//	int a = 1;
//	double b = 0.1;
//	char c = 'w';
//
//	cout << a << ' ' << b << ' ' << c << ' ' << endl;
//	std::cout << a << ' ' << b << ' ' << c << ' ' << std::endl;
//
//	scanf("%d%lf", &a, &b);
//	printf("%d %lf\n", a, b);
//
//	// 可以⾃动识别变量的类型
//	cin >> a;
//	cin >> b >> c;
//	cout << a << endl;
//	cout << b << ' ' << c << ' ' << endl;
//
//	return 0;
//}

//#include<iostream>
//using namespace std;
//
//void Func(int a = 0)
//{
//	cout << a << endl;
//}
//
//int main()
//{
//	Func();  // 没有传参时，使⽤参数的默认值
//	Func(10);// 传参时，使⽤指定的实参
//	return 0;
//}

//#include<iostream>
//using namespace std;
//
////全缺省
//void Func1(int a = 10, int b = 20, int c = 30)
//{
//	cout << "a = " << a << endl;
//	cout << "b = " << b << endl;
//	cout << "c = " << c << endl << endl;
//}
//
////半缺省
//void Func2(int a , int b = 20, int c = 30)
//{
//	cout << "a = " << a << endl;
//	cout << "b = " << b << endl;
//	cout << "c = " << c << endl << endl;
//}
//
//int main()
//{
//	Func1();
//	Func1(1);
//	Func1(1, 2);
//	Func1(1, 2, 3);
//
//	Func2(100);
//	Func2(100, 200);
//	Func2(100, 200, 300);
//	return 0;
//}

//#include<iostream>
//using namespace std;
//
////参数类型不同
//int Add(int left, int right)
//{
//	cout << "int Add(int left, int right)" << endl;
//	return left + right;
//}
//
//int Add(double left, double right)
//{
//	cout << "int Add(double left, double right)" << endl;
//	return left + right;
//}
//
////参数个数不同
//void f()
//{
//	cout << "f()" << endl;
//}
//
//void f(int a)
//{
//	cout << "f(int a)" << endl;
//}
//
////参数类型顺序不同
//void f(int a, char b)
//{
//	cout << "f(int a, char b)" << endl;
//}
//
//void f(char a, int b)
//{
//	cout << "f(char a, int b)" << endl;
//}
//
//// 返回值不同不能作为重载条件，因为调⽤时也⽆法区分
////void fxx()
////{}
////
////int fxx()
////{
//// return 0;
////}
//
//// 下⾯两个函数构成重载
//// f()但是调⽤时，会报错，存在歧义，编译器不知道调⽤谁
////void f1()
////{
////	cout << "f()" << endl;
////}
////void f1(int a = 10)
////{
////	cout << "f(int a)" << endl;
////}
//
//int main()
//{
//	Add(10, 20);
//	Add(10.1, 20.2);
//
//	f();
//	f(10);
//
//	f(10, 'a');
//	f('a', 10);
//
//	return 0;
//}

//#include<iostream>
//using namespace std;
//int main()
//{
//	int a = 0;
//
//	// 引⽤：b和c是a的别名
//	int& b = a;
//	int& c = a;
//
//	// 也可以给别名b取别名，d相当于还是a的别名
//	int& d = b;
//
//	++d;
//
//	cout << a << endl;
//	cout << b << endl;
//	cout << c << endl;
//	cout << d << endl;
//
//	// 这⾥取地址我们看到是⼀样的
//	cout << &a << endl;
//	cout << &b << endl;
//	cout << &c << endl;
//	cout << &d << endl;
//	return 0;
//}

//#include<iostream>
//using namespace std;
//int main()
//{
//	int a = 0;
//
//	// 编译报错：“ra”: 必须初始化引⽤
//	//int& ra;
//
//	int& b = a;
//
//	int c = 20;
//
//	// 这⾥并⾮让b引⽤c，因为C++引⽤不能改变指向，
//	// 这⾥是⼀个赋值
//	b = c;
//
//	cout << a << endl;
//	cout << b << endl;
//	cout << c << endl;
//
//	cout << &a << endl;
//	cout << &b << endl;
//	cout << &c << endl;
//	return 0;
//}

//#include<iostream>
//using namespace std;
//
//void Swap(int& ra, int& rb)
//{
//	int tmp = ra;
//	ra = rb;
//	rb = tmp;
//}
//
//int main()
//{
//	int a = 0;
//	int b = 1;
//	cout << a << ' ' << b << ' ' << endl;
//
//	Swap(a, b);
//	cout << a << ' ' << b << ' ' << endl;
//	return 0;
//}
//
// 指针变量也可以取别名，这⾥LTNode*& phead就是给指针变量取别名
// 这样就不需要⽤⼆级指针了，相对⽽⾔简化了程序
//void ListPushBack(LTNode** phead, int x)
//void ListPushBack(LTNode*& phead, int x)